package cn.edu.lcu.cs.javateaching.basic.array;

import java.util.Arrays;
import java.util.Scanner;

/**
 * <li>从控制台接收用户输入的成绩，成绩为0至100之间的整数，以任意负数作为结束标志</li>
 * <li>允许输入非法数据，遇到非法数据时程序不中断退出，而是忽略该数据项并简单提示</li>
 * 
 * @author Administrator
 *
 */
public class InputScores {

	private static final int MAX_LENGTH = 100;

	public static void main(String[] args) {
//		int[] scores = { 20, 0, 100, 90, 99, 80, 60, 89, 98 };
		int[] scores = inputScores();
		System.out.println("原始成绩单：");
		System.out.println(Arrays.toString(scores));
	}

	/**
	 * 从控制台接收用户输入的成绩，成绩为0至100之间的整数，以任意负数作为结束标志
	 * 
	 * @return
	 */
	private static int[] inputScores() {
		// 输入缓冲区
		int[] buffer = new int[MAX_LENGTH];

		System.out.println("请输入Java课程的成绩，以任意负数结束");
		Scanner scanner = new Scanner(System.in);
		int score = 0; // 保存用户输入的成绩
		int index = 0; // 循环变量
		// 当缓冲区未满的时候循环
		while (index < MAX_LENGTH) {
			try {
				// 接收用户输入的整数成绩
				score = scanner.nextInt();
				if (score < 0) {
					break; // 如果用户输入负数，跳出循环，结束输入
				}
				if (score <= 100) {
					// 成绩非负，而且小于等于100，保存到缓冲区
					buffer[index++] = score;
				} else {
					System.out.println("输入成绩有误：" + score);
				}
			} catch (Exception e) {
				// 若输入不合法数据，不能被转化为整数，会抛出异常
				// 如果不捕获并处理这个异常，程序就中途退出了
//				e.printStackTrace(); // 打印异常发生时的调用栈
				// 读取刚刚引起异常的用户输入项为字符串类型，即使后续代码用不到这个数据项也要读取一下
				// 如果没有这个调用，当下次循环的时候，仍然试图读取并解析这个非法输入项，仍会引发异常，陷入死循环
				String invalidData = scanner.next(); 
				System.out.println("输入成绩有误：" + invalidData);
			}
		}
		return Arrays.copyOf(buffer, index);
	}

}
